Shellscript grammar 1

기본 문법(bash shell)
쉘 스크립트는 파일로 작성 후, 파일로 실행
파일의 가장 위의 첫 라인은 #!/bin/bash로 시작
쉘 스크립트 파일은 실행 권한을 가지고 있어야 한다.
‘filename.sh' 형태로 파일이름을 가진다.
hello.sh
#!/bin/bash
echo "Hello Bash!"

celina@ubuntuserver:~/celina/shell$ vi hello.sh

celina@ubuntuserver:~/celina/shell$ ls -al

total 12

drwxrwxr-x 2 celina celina 4096 Jul 29 04:57 .

drwx------ 5 celina celina 4096 Jul 29 04:56 ..

-rw-rw-r-- 1 celina celina   32 Jul 29 04:57 hello.sh

celina@ubuntuserver:~/celina/shell$ chmod 777 hello.sh

celina@ubuntuserver:~/celina/shell$ ls -al

total 12

drwxrwxr-x 2 celina celina 4096 Jul 29 04:57 .

drwx------ 5 celina celina 4096 Jul 29 04:56 ..

-rwxrwxrwx 1 celina celina   32 Jul 29 04:57 hello.sh

celina@ubuntuserver:~/celina/shell$ ./hello.sh

Hello Bash!

쉘명령어를 조합해서 프로그래밍
'변수, 조건문, 반복문'
주석 #
#!/bin/bash
### notes notes notes ###
: << "END" #
echo " "
echo "test_01"
echo "test_02"
echo "test_03"
echo "test_04"
echo "test_05"
echo "test_06"
echo "test_07"
echo " "
END
echo " "

celina@ubuntuserver:~/celina/shell$ ./notes.sh

위는 모두 주석처리

변수
선언
    변수명=데이터
    변수명=데이터 사이에 띄어쓰기는 허용되지 않음
사용
    $변수명 으로 사용됨
#!/bin/bash
mysql_id='root'
mysql_directory='/etc/mysql'
mysql_num=55
echo $mysql_id $mysql_num
echo $mysql_directory

celina@ubuntuserver:~/celina/shell$ ./variables.sh

root 55

/etc/mysql

리스트 변수(리스트)
선언
    변수명=(데이터1 데이터2 데이터3…)
사용
    ${변수명[인덱스번호]}
#!/bin/bash
daemons=("httpd" "mysqld" "vsftpd")
echo ${daemons[1]} # 2
echo ${daemons[@]} #
echo ${daemons[*]} #
echo ${#daemons[@]} #
filelist=( $(ls) ) # $filelist
echo ${filelist[*]} #$filelist

celina@ubuntuserver:~/celina/shell$ ./list.sh

mysqld

httpd mysqld vsftpd

httpd mysqld vsftpd

3

hello.sh list.sh notes.sh variables.sh

참고)
echo ${daemons[1]}        mysqld
echo $daemons[1]        httpd[1]

$daemons를 변수로 인식하고, [1]를 추가적인 string으로 인식
$(쉘 명령어)        #명령어 결과

filelists=$(ls)
filelists=( $(ls) )        두개 같은 결과를 출력한다.
사전 정의된 변수
$$        #쉘 프로세스 번호
$0        #쉘스크립트 이름
$1 ~ $9       #명령줄 인수
$*        #모든 명령줄 인수리스트
$#        #인수의 개수
$?        #최근 실행한 명령어의 종료값
            # 0(성공), 1-125(에러), 126(파일이 실행가능하지 않음), 128-255(시그널 발생)
ex)
ls -al -z

$$: pid
$0: ls
$1: -al
$2: -z
$*: -al -z
$#: 2
shell.sh
#!/bin/bash
echo "PID" "" "1st" "" ""
echo $$ $0 $1 $* $#

celina@ubuntuserver:~/celina/shell$ ./shell.sh -al

PID 이름 1st인자 인자 인자수

2666 ./shell.sh -al -al 1

연산자
expr: 숫자 계산
expr를 사용하는 경우 역작은 따옴표( ` )를 사용해야 한다.(작은 따옴표 ‘ 아님)
연산자 *와 괄호 () 앞에는 역슬래시( \ )와 같이 사용
연산자와 숫자, 변수, 기호 사이에는 space를 넣어야 한다.
num=`expr \( 3 \* 5 \) / 4 + 7`
echo $num
조건문
기본 if 구문: 명령문을 꼭 탭으로 띄우지 않아도 된다.(then과 fi 사이에만 있으면 된다.)
if []
then
fi
if.sh
#!/bin/bash
a=$1
b=$2
if [ $a != $b ]
then
echo "NOT SAME"
exit
fi

celina@ubuntuserver:~/celina/shell$ ./if.sh 5 2

NOT SAME

조건
조건 작성이 다른 프로그래밍 언어와 달리 가독성이 현저히 떨어진다. 참조해서 사용할 것

문자비교
문자1 == 문자2
문자1 != 문자2
-z 문자        #문자가 null이면 참
-n 문자        #문자가 null이 아니면 참

수치비교
[[ $1 > $2 ]] 정상 동작하기는 하나 아래의 기본 문법 사용이 권장된다.( <=, >=은 동작 안함)
값1 -eq 값2        #equal
값1 -ne 값2        #not equal
값1 -lt 값2        #less than
값1 -le 값2        #less or equal
값1 -gt 값2        #greater than
값1 -ge 값2        #greater or equal
if2.sh
#!/bin/bash
if[ $1 -gt $2 ] # [[ $1 > $2 ]]
then
echo "$1 is higher than $2"
exit
fi
Function
function string_test1(){
echo "string test1"
echo ": ${@}"
}
#
string_test1 "hello" "world"

bash-3.2$ string_test1 "hello" "world"

string test1